package start;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;
import java.util.Set;

import org.junit.Before;
import org.junit.Test;

import pojo.Person;
import redis.clients.jedis.Jedis;

public class BasicDemo {
	private static final String PREFIX = "ABCDEF.";
	private static Jedis redis;

	// redis默认开启了保护，只允许本地回环连接请求（就是127.0.0.1），需要在redis.conf中修改。或设置密码、或bind许可ip。
	@Before
	public void setUp() {
		String host = "192.168.0.210";
		int port = 6379;
		redis = new Jedis(host, port);
		redis.auth("foobaredauth");
	}

	// STRING 操作 --TODO:实际上存储的是byte[]，所以可以存储任意内容
	@Test
	public void string() {

		// SET key value: 将字符串值value关联到key。
		redis.set("name", "wangjun1");
		redis.set("id", "123456");
		redis.set("address", "guangzhou");

		// SETEX key seconds value :将值value关联到key，并将key的生存时间设为seconds(以秒为单位)。
		redis.setex("foo", 5, "haha");

		// MSET key value [key value ...] :同时设置一个或多个key-value对。
		redis.mset("haha", "111", "xixi", "222");

		// redis.flushAll();清空所有的key
		System.out.println(redis.dbSize());// dbSize是多少个key的个数

		// APPEND key value :如果key已经存在并且是一个字符串，APPEND命令将value追加到key原来的值之后。
		redis.append("foo", "*00");// 如果key已经存在并且是一个字符串，APPEND命令将value追加到key原来的值之后。

		// GET key 返回key所关联的字符串值
		String foo = redis.get("foo");
		System.out.println(foo);

		// MGET key [key ...] 返回所有(一个或多个)给定key的值
		List<String> list = redis.mget("haha", "xixi");
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}

	@Test
	public void string2() {
		Person p = new Person();
		p.setName("小雯");
		p.setId("456321789");
		p.setAge(13);
		p.setWords("豆蔻年华二月初");

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		try {
			ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
			objectOutputStream.writeObject(p);
			byte[] byteArray = out.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// LIST 哈希操作
	@Test
	public void list() {
		// redis.lpush
		// redis.lset
		// redis.lrange

	}

	// SET 去重集合操作 。TODO:注意：集合操作的结果都可以保存到新的set，只要使用sxxxstore命令即可。
	@Test
	public void set() {
		String k1 = "friend:zhangsan";
		String k2 = "friend:lisi";
		// 1、添加两个集合
		redis.sadd(k1, "芙蓉", "柳絮", "清照", "师师", "莉莉");
		redis.sadd(k2, "小薇", "小雯", "莉莉", "朵朵", "多多", "芙蓉");

		// 2、获取集合成员
		Set<String> zs = redis.smembers(k1);
		System.out.println(zs);
		Set<String> ls = redis.smembers(k2);
		System.out.println(ls);

		// 3、获取两个集合的交集
		Set<String> inter = redis.sinter(k1, k2);
		System.out.println("两个集合的交集：" + inter);

		// 4、获取两个集合的并集
		Set<String> union = redis.sunion(k1, k2);
		System.out.println("两个集合的并集：" + union);

		// 5、集合的差集
		Set<String> diff = redis.sdiff(k1, k2);
		System.out.println("两个集合的差集：" + diff);

	}

	// HASH 哈希操作
	@Test
	public void hash() {
		// redis.hset
		// redis.hget
	}

	// SORTEDSET 可排序SET
	@Test
	public void sortedset() {
		// redis.zadd(key, scoreMembers);
		// redis.zincrby(key, score, member);
		// redis.zrange
		// redis.zrank
		// redis.zremxxx
	}

}
